home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / F2JW / trans / special.cpp < prev    next >
C/C++ Source or Header  |  1999-08-22  |  47KB  |  1,684 lines

  1. //
  2. // フランス語 → 日本語 翻訳プログラム
  3. //
  4. // 文章構成 解析部(その2)
  5.  
  6. #include "stdafx.h"
  7. #include    <string.h>
  8. #include    <ctype.h>
  9.  
  10. #include    "f2j.h"
  11. #include    "myprot.h"
  12.  
  13. extern    TOKEN        *lastToken;
  14. extern    TOKEN        *currentTree;
  15. extern    ADVERB        dic_adverb_NE;
  16. extern    BOOL        isChanged;
  17. extern    PREPOSITION    dic_DeInf[];
  18. extern    PREPOSITION    dic_among[];
  19. extern    JP_PREPOSITION    dic_jpr_de[];
  20. extern    FR_QUESTION    dic_Quel[];
  21. extern  CMP_TOKEN    pat_QueDeFois[];
  22.  
  23. JP_PRONOUN    dic_JpPronoun_Leur[] = {
  24.     JP_PRONOUN(
  25.         FR_ATTRIB_ALL,    FR_ATTRIB_NONE,
  26.         JP_PROP_ALL,    JP_PROP_NONE,
  27.         NULL,
  28.         "(彼/女/それ)ら",    JP_EMPHASIS_NONE,    FR_PART_NOUN_OBJECT_I,
  29.         FR_ATTRIB_ILS,    JP_PROP_HUMAN,        JP_UNIT_NONE
  30.     )
  31. };
  32.  
  33. // ne le leur donnez pas.
  34. PRONOUN    dic_pronoun_Leur = {
  35.     "leur",
  36.     FR_ATTRIB_ILS,    FR_SHORT_NONE,
  37.     JPPRONOUN_DIC(dic_JpPronoun_Leur)
  38. };
  39.  
  40.  
  41. //
  42. // Pass1ではわからなかった品詞を細かく再考
  43. //
  44. void
  45. ProcessSpecialWord1(TOKEN *start)
  46. {
  47.     TOKEN    *prev = start;
  48.     TOKEN    *p = prev->next;
  49.  
  50.     while(p && !isChanged) {
  51.         switch(p->frPart) {
  52.         case FR_PART_SPECIAL_AUSSI:        Process_AUSSI(start, prev, p);        break;
  53.         case FR_PART_SPECIAL_CE:        Process_CE(start, prev, p);            break;
  54.         case FR_PART_SPECIAL_COMME:        Process_COMME(start, prev, p);        break;
  55. //        case FR_PART_SPECIAL_D:            Process_D(start, prev, p);            break;
  56.         case FR_PART_SPECIAL_DE:        Process_DE(start, prev, p);            break;
  57.         case FR_PART_SPECIAL_GRACE:        Process_GRACE(start, prev, p);
  58.         case FR_PART_SPECIAL_DES:        Process2_DES(start, prev, p);    break;
  59.         case FR_PART_SPECIAL_EN:        Process_EN(start, prev, p);            break;
  60.         case FR_PART_SPECIAL_EST:        Process_EST(p);                        break;
  61.         case FR_PART_SPECIAL_FOIS:        Process_FOIS(start, prev, p);        break;
  62.         case FR_PART_SPECIAL_LA:        Process_LA(start, prev, p);            break;
  63.         case FR_PART_SPECIAL_LEUR:        Process_LEUR(start, prev, p);        break;
  64.         case FR_PART_SPECIAL_LEQUEL:    Process_LEQUEL(start, prev, p);        break;
  65.         case FR_PART_SPECIAL_MEME:        Process_MEME(start, prev, p);        break;
  66.         case FR_PART_SPECIAL_MOINS:        Process_MOINS(start, prev, p);        break;
  67.         case FR_PART_SPECIAL_NI:        Process_NI(start, prev, p);            break;
  68.         case FR_PART_SPECIAL_NIMPORTE:    Process_NIMPORTE(start, prev, p);    break;
  69.         case FR_PART_SPECIAL_PEU:        Process_PEU(start, prev, p);        break;
  70.         case FR_PART_SPECIAL_QUAND:        Process_QUAND(start, p);            break;
  71.         case FR_PART_SPECIAL_QUI:        Process_QUI(start, prev, p);        break;
  72.         case FR_PART_SPECIAL_QUOI:        Process_QUOI(start, prev, p);        break;
  73.         case FR_PART_SPECIAL_QUE:        Process_QUE(start, prev, p);        break;
  74.         case FR_PART_SPECIAL_OU:        Process_OU(start, prev, p);            break;
  75.         case FR_PART_SPECIAL_PLUS:        Process_PLUS(start, prev, p);        break;
  76.         case FR_PART_SPECIAL_COMMA:        Process_COMMA(start, prev, p);        break;
  77.         case FR_PART_SPECIAL_S:            Process_S(start, p);                break;
  78.         case FR_PART_SPECIAL_SI:        Process_SI(start, p);                break;
  79.         case FR_PART_SPECIAL_SEULEMENT:Process_SEULEMENT(start, p);        break;
  80.         case FR_PART_SPECIAL_TOUT:        Process_TOUT(start, prev, p);        break;
  81.         }
  82.         prev = p;
  83.         p = p->next;
  84.     }
  85. }
  86.  
  87. CMP_TOKEN    patAussi1[] = {
  88.     // j'ai aussi voiture.
  89. //    CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_NONE,    NULL),
  90.     CMP_TOKEN( FR_PART_VERB_UNCLEAR,    JP_PROP_NONE,    NULL),
  91.     CMP_TOKEN( FR_PART_SPECIAL_AUSSI,    JP_PROP_NONE,    NULL),
  92.     CMP_TOKEN( FR_PART_NONE)
  93. };
  94.  
  95. //
  96. // "aussi"を見分ける
  97. //  副詞
  98. void
  99. Process_AUSSI(TOKEN *start, TOKEN *prev, TOKEN *p)
  100. {
  101.     TOKEN    *next = p->next;
  102.  
  103.     if(IsObjectMatch(prev, FR_PART_SENTENCE_ALL)) {
  104.         DisconnectTOKEN(start, p);
  105.         if(prev->object1) {
  106.             TOKEN    *subject = prev->object1;
  107.             subject->jpEmphasis |= JP_EMPHASIS_MO;
  108.         }
  109.         return;
  110.     }
  111.     if(IsPatternMatch(patAussi1, prev)) {
  112.         DisconnectTOKEN(start, p);
  113.         prev->jpEmphasis |= JP_EMPHASIS_MO;
  114.         return;
  115.     }
  116.     // je vais aussi (en Italie et en Espagne).
  117.     if(next
  118.     && (next->frPart & FR_PART_COMBINE)) {
  119.         DisconnectTOKEN(start, p);
  120.         next->jpEmphasis |= JP_EMPHASIS_MO;
  121.     }
  122. }
  123.  
  124.  
  125. //
  126. // 'ce'を見分ける
  127. // 主語代名詞、指示形容詞
  128. //
  129. void
  130. Process_CE(TOKEN *start, TOKEN *prev, TOKEN *p)
  131. {
  132.     TOKEN    *next = p->next;
  133.  
  134.     if((prev->frPart & FR_PART_VERB) && prev->punctuation == FR_PUNCT_HYPHEN) {
  135.         // quelle fleur est-<ce> ?
  136.         ChangeToPronoun(p, "ce");
  137.         return;
  138.     }
  139.  
  140.     if(next == NULL)    return;
  141.  
  142.     if(next->frPart & FR_PART_VERB) {
  143.         ChangeToPronoun(p, "ce");
  144.     } else if((next->frPart & FR_PART_ADJECTIVE)
  145.             || (next->frPart & FR_PART_NOUN)) {
  146.         // 指示形容詞
  147.         ChangeToProadjective(p, "ce");
  148.     } else if(next->frPart == FR_PART_SPECIAL_QUE
  149.             || next->frPart == FR_PART_SPECIAL_QUOI) {
  150.         // vous ferez <ce> que je vous dis.
  151.         ChangeToPronoun(p, "ce");
  152.         next->frPart = FR_PART_RELATIVE_OBJECT_N;
  153.     } else if(next->frPart == FR_PART_SPECIAL_QUI) {
  154.         // ce qui n'est pas clair n'est pas fran\ais.
  155.         ChangeToPronoun(p, "ce");
  156. //        next->frPart = FR_PART_RELATIVE_SUBJECT;
  157.     }
  158. }
  159.  
  160. //
  161. // ','を見分ける
  162. // 
  163. void
  164. Process_COMMA(TOKEN *start, TOKEN *prev, TOKEN *p)
  165. {
  166.     TOKEN    *next = p->next;
  167.  
  168.     if(next == NULL)    return;
  169.  
  170.     if(IsObjectMatch(prev, FR_PART_INDEPENDENCE_INTERJECTION)) {
  171.         ChangeToCombine(p, ",");
  172.         p->frPart = FR_PART_COMBINE_VERB;
  173. #if 1
  174.     } else if((prev->frPart & FR_PART_COMBINE)
  175.         && prev->object2 == NULL) {
  176.         // Mais, o| est les neiges d'antan?
  177.         DisconnectTOKEN(start, p);
  178.         next->punctuation = FR_PUNCT_COMMA;
  179.     } else if((next->frPart & FR_PART_COMBINE)
  180.         && next->object1 == NULL) {
  181.         if(next->object2 != NULL) {
  182.             // , mais SV,    , car SV
  183.             DisconnectTOKEN(start, p);
  184.             next->punctuation = FR_PUNCT_COMMA;
  185.         }
  186. #endif
  187. #if 1
  188.     // ProcessCombine1, ProcessCombine2とほぼ同様
  189.     // ただし、いったん、FR_PART_COMBINE_GENERALに変更すると、
  190.     // その分、候補が多くなってしまうので、自前で処理する
  191.     } else if(SearchToken(FR_PART_VERB, start, p)
  192.         && (p->frPartChoice & FR_PART_VERB)
  193.         && IsObjectMatch(next, FR_PART_VERB_ALL)) {
  194.             // 文章同士でも連結しない場合がある eg) d{s qu'il fut arriv{, elle sortit.
  195.             CopyCurrentTree(p, "Comma-1", FR_PART_VERB);
  196.             ChangeToCombine(p, ",");
  197.             p->frPart = FR_PART_COMBINE_VERB;
  198.             // FR_PART_VERBの連結は、FR_PART_SENTENCE_NO_SUBJECTを作ってから、行う
  199.     } else if(IsObjectMatch(prev, FR_PART_NOUN_ALL)
  200.         && (p->frPartChoice & FR_PART_NOUN)
  201.         && IsObjectMatch(next, FR_PART_NOUN_ALL)) {
  202.         CopyCurrentTree(p, "Comma 1", FR_PART_NOUN);
  203.         ChangeToCombine(p, ",");
  204.         p->frPart = FR_PART_COMBINE_NOUN;
  205.     } else if(IsObjectMatch(prev, FR_PART_ADJECTIVE_ALL)
  206.         && (p->frPartChoice & FR_PART_ADJECTIVE)
  207.         && IsObjectMatch(next, FR_PART_ADJECTIVE_ALL)) {
  208.             CopyCurrentTree(p, "Comma 2", FR_PART_ADJECTIVE);
  209.             ChangeToCombine(p, ",");
  210.             p->frPart = FR_PART_COMBINE_ADJECTIVE;
  211.     } else if(IsObjectMatch(prev, FR_PART_ADVERB_ALL)
  212.         && (p->frPartChoice & FR_PART_ADVERB)
  213.         && IsObjectMatch(next, FR_PART_ADVERB_ALL)) {
  214.             CopyCurrentTree(p, "Comma 3", FR_PART_ADVERB);
  215.             ChangeToCombine(p, ",");
  216.             p->frPart = FR_PART_COMBINE_ADJECTIVE;    // FR_PART_COMBINE_ADVERBはない
  217.     } else if(SearchToken(FR_PART_PREPOSIT, start, p)
  218.         && (p->frPartChoice & FR_PART_PREPOSIT)
  219.         && IsObjectMatch(next, FR_PART_PREPOSIT)) {
  220.             CopyCurrentTree(p, "Comma 4", FR_PART_PREPOSIT);
  221.             ChangeToCombine(p, ",");
  222.             p->frPart = FR_PART_COMBINE_PREPOSIT;
  223. #endif
  224.     }
  225. }
  226.  
  227. //
  228. // 'comme'を見分ける
  229. // 接続詞、副詞(感嘆詞)、前置詞
  230. //
  231. void
  232. Process_COMME(TOKEN *start, TOKEN *prev, TOKEN *p)
  233. {
  234.     TOKEN    *next = p->next;
  235.  
  236.     if(next == NULL)    return;
  237.  
  238.     if((SearchToken(FR_PART_VERB_ALL, p->next))
  239.     && (currentTree->punctuation & FR_PUNCT_EXCLAMINATION)) {
  240.         TOKEN *altP = CopyCurrentTree(p, "Comme 2", FR_PART_ADVERB);
  241.         ChangeToProadverb(altP, "comme");
  242.     }
  243.     // ~として、    elle est excellente comme secr{taire.
  244.     // ~のように
  245. //    TOKEN    *altP = CopyCurrentTree(p, "Comme 3", FR_PART_PREPOSIT);
  246.     ChangeToPreposition(p, "comme");
  247. }
  248.  
  249.  
  250. CMP_TOKEN    pat_AdjDeNoun[] = {
  251.     // eloigne de la plage.
  252.     CMP_TOKEN( (FR_PART)(FR_PART_ADVERB_ALL | FR_PART_ADJECTIVE_ALL),    JP_PROP_PLACE,    NULL),
  253.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  254.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_PLACE,    NULL),
  255.     CMP_TOKEN( FR_PART_NONE)
  256. };
  257.  
  258. CMP_TOKEN    pat_NounDePlus1[] = {
  259.     // il a deux ans de plus que moi.
  260.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_UNIT,    NULL),
  261.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  262.     CMP_TOKEN( FR_PART_SPECIAL_PLUS,    JP_PROP_NONE,    NULL),
  263.     CMP_TOKEN( FR_PART_NONE)
  264. };
  265.  
  266. CMP_TOKEN    pat_NounDePlus2[] = {
  267.     // chose de meilleur.
  268.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_UNIT,    NULL),
  269.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  270.     CMP_TOKEN( (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL),    JP_PROP_NONE,    IsCompare),
  271.     CMP_TOKEN( FR_PART_NONE)
  272. };
  273.  
  274. CMP_TOKEN    pat_NePasDuTout[] = {
  275.     // il n'est pas du tout malade.
  276.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  277.     CMP_TOKEN( FR_PART_ARTICLE_DEFINIT,JP_PROP_NONE,    NULL),
  278.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,    JP_PROP_NONE,    NULL),
  279.     CMP_TOKEN( FR_PART_NONE)
  280. };
  281.  
  282. BOOL
  283. IsNotSubject(TOKEN *p)
  284. {
  285.     // Venez-(vous <de> Paris)? ()を防ぐ
  286.     if(!IsObjectMatch(p, FR_PART_NOUN_SUBJECT))
  287.         return(TRUE);
  288.  
  289.     return(FALSE);
  290. }
  291.  
  292. CMP_TOKEN    pat_PNounDeNoun1[] = {
  293.     // celui de votre fr}re.
  294.     CMP_TOKEN((FR_PART)(FR_PART_NOUN_DEMONSTRATIVE | FR_PART_NOUN_OBJECT_BOTH | FR_PART_NOUN_INDEFINIT),
  295.         JP_PROP_NONE,    IsNotSubject),
  296.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  297.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_NONE,    NULL),
  298.     CMP_TOKEN( FR_PART_NONE)
  299. };
  300.  
  301. JP_COMBINE    jpCombineDeSortQue[] = {
  302.     JP_COMBINE("%s1。それで、%s2",    FR_PART_NONE,
  303.         FR_PART_SENTENCE_NORMAL,JP_PROP_NONE,
  304.         FR_PART_SENTENCE_ALL,    JP_PROP_NONE
  305.     ),
  306. };
  307. COMBINE    combineDeSortQue =
  308. {
  309.     "de sort que",    FALSE,    FR_PART_COMBINE_VERB,    JPCOMBINE_DIC(jpCombineDeSortQue)
  310. };
  311.  
  312.  
  313. CMP_TOKEN    pat_DeSorteQue[] = {
  314.     // elle n'est pas venue, de sorte que nous avons d~ changer notre projet.
  315.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  316.     CMP_TOKEN( FR_PART_NOUN_GENERAL,    "sorte"),
  317.     CMP_TOKEN( FR_PART_SPECIAL_QUE,    JP_PROP_NONE,    NULL),
  318.     CMP_TOKEN( FR_PART_NONE)
  319. };
  320.  
  321.  
  322. // D'Autre
  323. JP_PRONOUN    dic_De_Autre[] = {
  324.     JP_PRONOUN(     FR_ATTRIB_ALL,    FR_ATTRIB_NONE,
  325.         JP_PROP_ALL,    JP_PROP_NONE,
  326.         NULL,
  327.         "他の人",        JP_EMPHASIS_NONE,    FR_PART_NOUN_INDEFINIT,
  328.         FR_ATTRIB_ILS,    JP_PROP_HUMAN,        JP_UNIT_NONE
  329.     )
  330. };
  331. PRONOUN    pronounDe_Autre = {
  332.     "de autre",    FR_ATTRIB_JE,    FR_SHORT_NONE,        JPPRONOUN_DIC(dic_De_Autre)
  333. };
  334.  
  335. //
  336. // 'de'を見分ける
  337. // 不定冠詞、部分冠詞、前置詞(infを導く)、形容詞をともなう冠詞、否定冠詞
  338. void
  339. Process_DE(TOKEN *start, TOKEN *prev, TOKEN *p)
  340. {
  341.     TOKEN    *next = p->next;
  342.  
  343.     if(next == NULL)    return;
  344.  
  345.     if(IsPatternMatch(pat_NounDePlus1, prev)) {
  346.         DisconnectTOKEN(start, p->next);    // "plus"を削除
  347.         DisconnectTOKEN(start, p);            // "de"を削除
  348.         prev->frAttrib = (FR_ATTRIB)(prev->frAttrib | FR_ATTRIB_PLUS);
  349.         return;
  350.     } 
  351.     if(IsPatternMatch(pat_NounDePlus2, prev)) {
  352.         TOKEN    *adj = p->next;
  353.         DisconnectTOKEN(start, adj);        // "meilleur"を削除
  354.         DisconnectTOKEN(start, p);            // "de"を削除
  355.         AddChildTOKEN(prev, adj);
  356.         return;
  357.     }
  358.     if((prev->jpProp & JP_PROP_NEGATIVE)
  359.     && IsPatternMatch(pat_NePasDuTout, p)) {    // il n'est pas du tout malade.
  360.         ChangeToAdverb(next->next, "tout");
  361.         DisconnectTOKEN(start, next);    // "de"を削除    du = de + le
  362.         DisconnectTOKEN(start, p);    // "le"を削除        du = de + le
  363.         return;
  364.     }
  365.     if(IsPatternMatch(pat_PNounDeNoun1, prev)) {        // celui de votre fr}re.
  366.         ChangeToPreposition(p, "de");
  367.         p->frPartParent = FR_PART_NOUN;
  368.         return;
  369.     }
  370.     if(IsPatternMatch(pat_DeSorteQue, p)) {        // de sorte que
  371.         ChangeToCombine(p, &combineDeSortQue);
  372.         DisconnectTOKEN(start, p->next->next);    // "que"を削除
  373.         DisconnectTOKEN(start, p->next);    // "sorte"を削除
  374.         return;
  375.     }
  376.     if(IsObjectMatch(next, FR_PART_ADJECTIVE_ALL, JP_PROP_NONE, NULL, "autre")    // D'autre
  377.     && (next->next == NULL || !(next->next->frPart & FR_PART_NOUN))) {
  378.         ChangeToPronoun(next, &pronounDe_Autre);
  379.         DisconnectTOKEN(start, p);            // "de"を削除
  380.         return;
  381.     }
  382.  
  383.     // 不定詞を導く前置詞
  384.     if((next->frPart & FR_PART_VERB)
  385.     && (next->frTense & FR_TENSE_ORIGIN)) {
  386.         ChangeToPreposition(p, dic_DeInf);
  387.         return;
  388.     }
  389.     // 冠詞(部分冠詞, des + 形容詞 + 複数名詞、否定冠詞)
  390.     if((!(prev->frPart & FR_PART_NOUN) || (prev->frPart & FR_PART_COMBINE))
  391.     && (p->frPartChoice & FR_PART_ARTICLE)
  392.     && IsObjectMatch(next, FR_PART_NOUN_ALL)) {
  393.         p->frPartChoice = (FR_PART)(p->frPartChoice & ~FR_PART_ARTICLE);
  394.         if(ProcessArticleDe(start, p, next))    return;
  395.     }
  396.     if(((prev->frPart & FR_PART_COMBINE) || !(prev->frPart & FR_PART_PREPOSIT))
  397.     && (p->frPartChoice & FR_PART_PREPOSIT)) {
  398.         // 前置詞の可能性
  399.         if(IsPatternMatch(pat_AdjDeNoun, prev)) {
  400.             ChangeToPreposition(p, "de");
  401.         } else if(! SearchToken(FR_PART_SPECIAL_DE, p->next)) {
  402.             // 後ろから解析する eg) la maison de (frere de Marie).
  403.             ProcessPrepositionDe(start, prev, p, next);
  404.         }
  405.     }
  406. }
  407.  
  408. //
  409. // 冠詞としての"de"を検討
  410. // 部分冠詞, des + 形容詞 + 複数名詞、否定冠詞
  411. //
  412. BOOL
  413. ProcessArticleDe(TOKEN *start, TOKEN *p, TOKEN *noun)
  414. {
  415.     TOKEN *article = SearchToken(FR_PART_ARTICLE_DEFINIT, noun->child);
  416.  
  417.     if(!IsObjectMatch(noun, FR_PART_NOUN_GENERAL))
  418.         return(FALSE);
  419.  
  420.     if(!(noun->frAttrib & FR_ATTRIB_PLURAL)    // de + lesはない
  421.     && article
  422.     && !SearchToken(FR_PART_ARTICLE_PARTIAL, noun->child)
  423.     && !SearchToken(FR_PART_ARTICLE_INFINIT, noun->child)) {
  424.         // 部分冠詞
  425.         if(!(noun->jpProp & JP_PROP_PARTIAL))    // 問答無用
  426.             MakeOtherChoiceDe(p, FR_PART_ARTICLE, "De 1");
  427.         ChangeToArticle(article, "de");
  428.         article->frPart = FR_PART_ARTICLE_PARTIAL;
  429. //        p->frAttrib = next->frAttrib;
  430.         DisconnectTOKEN(start, p);    // de + la -> 一つの単語として扱う
  431.     } else if((noun->frAttrib & FR_ATTRIB_PLURAL)
  432.         && SearchToken(FR_PART_ADJECTIVE_GENERAL_F, noun->child)
  433.         && SearchToken(FR_PART_ADJECTIVE_POSSESIVE, noun->child) == NULL    // 所有形容詞がつく時は冠詞は使わない
  434.         && SearchToken(FR_PART_ARTICLE_ALL, noun->child) == NULL) {
  435.         // des petites revues -> <de> petites revues.
  436.         MakeOtherChoiceDe(p, FR_PART_ARTICLE, "De 2");
  437.         ChangeToArticle(p, "des");
  438.     } else if(SearchNegativeToken(start, p)
  439.         && SearchToken(FR_PART_ARTICLE_ALL, noun->child) == NULL) {
  440.         // 否定冠詞
  441.         MakeOtherChoiceDe(p, FR_PART_ARTICLE, "De 3");
  442.         ChangeToArticle(p, "de");
  443.         p->frPart = FR_PART_ARTICLE_NEGATIVE;
  444.     } else
  445.         return(FALSE);
  446.  
  447.     return(TRUE);
  448. }
  449.  
  450. //
  451. // 前置詞としての"de"を検討
  452. // 部分冠詞, des + 形容詞 + 複数名詞、否定冠詞
  453. //
  454. BOOL
  455. ProcessPrepositionDe(TOKEN *start, TOKEN *prev, TOKEN *p, TOKEN *next)
  456. {
  457.     static TOKEN    dummy;
  458.  
  459.     BOOL    savIsChanged = isChanged;
  460.     ChangeToPreposition(&dummy, "de");    // 試しに代えてみて
  461.     if(MatchPrepositionObject(&dummy, next) == NULL) {
  462.         isChanged = savIsChanged;    // 駄目だったら、元に戻す。
  463.         return(FALSE);
  464.     }
  465.  
  466.     TOKEN *altP = MakeOtherChoiceDe(p, FR_PART_PREPOSIT, "De 5");
  467.  
  468.     ChangeToPreposition(p, "de");
  469.  
  470.     // 最上位比較級の<de>?
  471.     if(IsWordOwner(prev, (FR_ATTRIB)(FR_ATTRIB_TOP | FR_ATTRIB_ONE_OF))
  472.     && SearchToken(FR_PART_PREPOSIT_DE_AMONG, prev->child) == NULL) {
  473.         for(TOKEN *q = start; q; q = q->next) {
  474.             if(q->frPart == FR_PART_PREPOSIT_DE_AMONG)    break;
  475.         }
  476.         if(q == NULL)
  477.             ChangeToPreposition(p, dic_among);
  478.     }
  479.     return(TRUE);
  480. }
  481.  
  482. //
  483. // "De"の別候補Treeを必要なら作成
  484. //
  485. TOKEN
  486. *MakeOtherChoiceDe(TOKEN *p, FR_PART mask, char *s)
  487. {
  488.     FR_PART    choice = (FR_PART)(p->frPartChoice & ~mask);
  489.     if((choice & FR_PART_ARTICLE)
  490.     || (choice & FR_PART_PREPOSIT)) {
  491.         TOKEN *altP = CopyCurrentTree(p, s);
  492.         altP->frPartChoice = choice;
  493.         return(altP);
  494.     }
  495.     return(NULL);
  496. }
  497.  
  498. TOKEN
  499. *SearchNegativeToken(TOKEN *start, TOKEN *end)
  500. {
  501.     TOKEN    *p;
  502.  
  503.     for(p = start; p && p != end; p = p->next) {
  504.         if(p->jpProp & JP_PROP_NEGATIVE)    return(p);
  505.     }
  506.     return(NULL);
  507. }
  508.  
  509. static JP_PREPOSITION    jp_GraceA[] = {
  510.     JP_PREPOSITION(    "%1Nおかげ",    JP_KIND_RENTAISHI,
  511.         JP_PROP_CONDITION,
  512.         CMP_TOKEN ( FR_PART_SENTENCE_ALL),
  513.         CMP_TOKEN ( FR_PART_NOUN_ALL)
  514.     ),
  515. };
  516.  
  517. PREPOSITION fr_GraceA[] = {
  518.     { "gr`ce_A",    FR_PART_PREPOSIT_GRACE_A,    JPPREPOSIT_DIC(jp_GraceA)        },
  519. };
  520.  
  521. //
  522. // 'grace'を見分ける
  523. // 名詞、前置詞(Grance a ~ ~のおかげで)
  524. void
  525. Process_GRACE(TOKEN *start, TOKEN *prev, TOKEN *p)
  526. {
  527.     TOKEN    *next = p->next;
  528.  
  529.     if(next
  530.     && next->frPart == FR_PART_PREPOSIT_A) {
  531.         ChangeToPreposition(p, fr_GraceA);
  532.         DisconnectTOKEN(start, next);
  533.     } else {
  534.         ChangeToNoun(p, "gr@ce");
  535.     }
  536. }
  537.  
  538. //
  539. // 'l@'を見分ける
  540. // 副詞、後置指示形容詞(この voiture-l@)
  541. void
  542. Process_LA(TOKEN *start, TOKEN *prev, TOKEN *p)
  543. {
  544.     if(p->next
  545.     && (p->punctuation & FR_PUNCT_HYPHEN)
  546.     && IsTokenFrench(p->next, "bas")) {
  547.         // l@-bas?
  548.         ChangeToAdverb(p, "l@-bas");
  549.         DisconnectTOKEN(start, p->next);
  550.     } else if(prev
  551.     && IsObjectMatch(prev, (FR_PART)(FR_PART_NOUN_GENERAL | FR_PART_NOUN_DEMONSTRATIVE))
  552.     && (prev->punctuation & FR_PUNCT_HYPHEN)) {
  553.         ChangeToProadjective(p, "l@");
  554.     } else if(p->punctuation & FR_PUNCT_HYPHEN) {
  555.         currentTree->prtControl = PRT_CONTROL_DISABLE;
  556.     }else {
  557.         ChangeToAdverb(p, "l@");
  558.     }
  559. };
  560.  
  561. //
  562. // 'leur'を見分ける
  563. // 所有形容詞、間接目的代名詞
  564. void
  565. Process_LEUR(TOKEN *start, TOKEN *prev, TOKEN *p)
  566. {
  567.     TOKEN    *next = p->next;
  568.  
  569.     if(next == NULL)    return;
  570.  
  571.     // 所有形容詞
  572.     if(next->frPart & FR_PART_NOUN) {
  573.         ChangeToProadjective(p, "leur");
  574.         AttachAdjective(start, next, p, FR_LOCATION_FRONT);
  575.         return;
  576.     }
  577.     // 間接目的代名詞
  578.     if(IsObjectMatch(next, FR_PART_VERB_UNCLEAR)
  579.     ||  next->frPart == FR_PART_ADVERB_Y
  580.     ||  next->frPart == FR_PART_SPECIAL_EN) {
  581.         ChangeToPronoun(p, &dic_pronoun_Leur);
  582.         return;
  583.     }
  584.     PrintInternalError( "この<leur>はまったよーん\n");
  585. }
  586.  
  587. //
  588. // 'lequel'を見分ける
  589. // 接続詞
  590. void
  591. Process_LEQUEL(TOKEN *start, TOKEN *prev, TOKEN *p)
  592. {
  593.     if(start == prev                // 先頭にあるということは、疑問代名詞に確定
  594.     || IsObjectMatch(prev, FR_PART_SPECIAL_COMMA)) {    // Quand vous parle de ces hommes, duquel parlez-vous?
  595.         ChangeToQuestion(p, ((SPECIALWORD *)p->what)->french);
  596.         return;
  597.     }
  598.  
  599.     if((prev->frPart & FR_PART_NOUN)
  600.     && p->preposition) {
  601.         p->frPart = FR_PART_RELATIVE_OBJECT_N;
  602.         // 主格でないので、必ず次に主語が必要 eg) adresse auxquelles vous {crirez.
  603.         if(p->next && IsObjectMatch(p->next, FR_PART_NOUN_OBJECT_BOTH)) {
  604.             p->next->frPart = (FR_PART)(p->next->frPart & ~FR_PART_NOUN_OBJECT_BOTH);
  605.             p->next->frPart = (FR_PART)(p->next->frPart | FR_PART_NOUN);
  606.         }
  607.         isChanged = TRUE;
  608.     }
  609. }
  610.  
  611. //
  612. // 'moins'を見分ける
  613. // plus S+V, <moins> S+V
  614. // (比較級は、CombinePlusAdjectiveで処理されている)
  615. //
  616. void
  617. Process_MOINS(TOKEN *start, TOKEN *prev, TOKEN *p)
  618. {
  619.     TOKEN    *next = p->next;
  620.  
  621.     // Il l'est moins.
  622.     if(next == NULL) {
  623.         ChangeToAdverb(p, "moins");
  624.         return;
  625.     }
  626.  
  627.     if( next
  628.     && IsObjectMatch(next,  FR_PART_SENTENCE_ALL)) {
  629.         // plus S+V, <moins> S+V
  630.         ChangeToAdverb(p, "moins");
  631.         return;
  632.     }
  633. }
  634.  
  635.  
  636. //
  637. // 'memel'を見分ける
  638. // 形容詞、代名詞、副詞
  639. void
  640. Process_MEME(TOKEN *start, TOKEN *prev, TOKEN *p)
  641. {
  642.     if(IsObjectMatch(prev, FR_PART_NOUN_PERSONAL)
  643.     && (prev->punctuation & FR_PUNCT_HYPHEN)) {
  644.         // moi-memes 自分自身
  645.         DisconnectTOKEN(start, p);
  646.         prev->jpEmphasis = JP_EMPHASIS__MEME;
  647.         return;
  648.     }
  649.     if(IsObjectMatch(prev, FR_PART_NOUN_ALL)) {
  650.         // ~でさえ、
  651.         // ses ennemis m]mes ne pouvaient lui refuser du talent.
  652.         DisconnectTOKEN(start, p);
  653.         prev->jpEmphasis = JP_EMPHASIS_MEME;
  654.         return;
  655.     }
  656.     if(p->next
  657.     && IsObjectMatch(p->next, FR_PART_NOUN_ALL)) {
  658.         ChangeToAdjective(p, *(char **)p->what);
  659.         return;
  660.     }
  661.     // 不定冠詞の後は、不定代名詞
  662.     //    Ils restent les m]mes.
  663.     if(IsObjectMatch(prev, FR_PART_ARTICLE_DEFINIT)) {
  664.         ChangeToPronoun(p, "m]me");
  665.         DisconnectTOKEN(start, p);
  666.         return;
  667.     }
  668.  
  669.     if(p->frAttrib & FR_ATTRIB_SINGLE)
  670.         ChangeToAdverb(p, "m]me");
  671. }
  672.  
  673. //
  674. // 'ni'を見分ける
  675. // je n'ai <ni> p}re <ni> m}re.
  676. //         無視     接続詞
  677.  
  678. void
  679. Process_NI(TOKEN *start, TOKEN *prev, TOKEN *p)
  680. {
  681.     if(p
  682.     && p->next
  683.     && p->next->next
  684.     && p->next->next->frPart == FR_PART_SPECIAL_NI) {
  685.         TOKEN *ni2 = p->next->next;
  686.         p->next->jpEmphasis |= JP_EMPHASIS_NI;
  687.         ni2->next->jpEmphasis |= JP_EMPHASIS_NI;
  688.         ChangeToCombine(ni2, "ni");
  689.         DisconnectTOKEN(start, p);
  690.     } else if((prev->frPart & FR_PART_NOUN)
  691.         && p->next) {
  692.         ChangeToCombine(p, "ni");
  693.         p->frPart = FR_PART_COMBINE_NOUN;
  694.         prev->jpEmphasis |= JP_EMPHASIS_NI;
  695.         p->next->jpEmphasis |= JP_EMPHASIS_NI;
  696.     } else if((prev->frPart & FR_PART_ADJECTIVE)
  697.         && p->next) {
  698.         ChangeToCombine(p, "ni");
  699.         p->frPart = FR_PART_COMBINE_ADJECTIVE;
  700.         prev->jpEmphasis |= JP_EMPHASIS_NI;
  701.         p->next->jpEmphasis |= JP_EMPHASIS_NI;
  702.     }
  703. }
  704.  
  705.  
  706.  
  707.     
  708. static    JP_PROADJECTIVE    jpadj_NImporteQuel[] = {
  709.     JP_PROADJECTIVE(
  710.         FR_PART_ADJECTIVE_DEMONSTRATIVE,
  711.         "どんな",        JP_KIND_NONE,
  712.         JP_PROP_CONDITION)
  713. };
  714.  
  715. PROADJECTIVE    proadjN_IMPORTE_QUELLE[] = {
  716.     { "n'importe quel",        FR_ATTRIB_NONE,    FR_CHANGE_NONE, JPPROADJ_DIC(jpadj_NImporteQuel)    },
  717. };
  718.  
  719. static JP_PRONOUN    jpnn_NImporteQuel[] = {
  720.     JP_PRONOUN(     FR_ATTRIB_ALL,    FR_ATTRIB_NONE,
  721.         JP_PROP_ALL,    JP_PROP_NONE,
  722.         NULL,
  723.         "何",        JP_EMPHASIS_DEMO,    FR_PART_NOUN_INDEFINIT,
  724.         FR_ATTRIB_NONE,    JP_PROP_THING,    JP_UNIT_NONE
  725.     )
  726. };
  727.  
  728. PRONOUN            pronounN_IMPORTE_QUOI[] = {
  729.     { "n'importe quoi",        FR_ATTRIB_NONE,    FR_SHORT_NONE, JPPRONOUN_DIC(jpnn_NImporteQuel)    },
  730. };
  731.  
  732. static JP_ADVERB jpadvN_IMPORTE_OU[] = {
  733.     JP_ADVERB("どこでも",    JP_KIND_NONE,    JP_PROP_PLACE,    JP_PROP_ALL)
  734. };
  735.  
  736. ADVERB    advN_IMPORTE_OU[] = {
  737.     "n'importe o|",    JPADVERB_DIC(jpadvN_IMPORTE_OU),    NULL,    NULL
  738. };
  739.  
  740. //
  741. // 'n'importe'を見分ける
  742. //
  743. void
  744. Process_NIMPORTE(TOKEN *start, TOKEN *prev, TOKEN *p)
  745. {
  746.     TOKEN    *next = p->next;
  747.  
  748.     if(next == NULL)    return;
  749.  
  750.     FR_ATTRIB    frAttrib = next->frAttrib;
  751.     char    *str = GetTokenFrench(next);
  752.  
  753.     if(!strcmp(str, "quel")
  754.     || !strcmp(str, "quelle")
  755.     || !strcmp(str, "quels")
  756.     || !strcmp(str, "quelles")) {
  757.         ChangeToProadjective(p, proadjN_IMPORTE_QUELLE);
  758.         TOKEN *noun = SearchToken(FR_PART_NOUN_GENERAL, next);
  759.         if(noun)
  760.             noun->jpEmphasis |= JP_EMPHASIS_DEMO;
  761.     } else if(next->frPart == FR_PART_SPECIAL_QUOI) {
  762.         ChangeToPronoun(p, pronounN_IMPORTE_QUOI);
  763.     } else if(next->frPart == FR_PART_SPECIAL_OU) {
  764.         ChangeToAdverb(p, advN_IMPORTE_OU);
  765.     } else
  766.         return;
  767.  
  768.     DisconnectTOKEN(start, next);
  769.     p->frAttrib = frAttrib;
  770. }
  771.  
  772. //
  773. // 'en'を見分ける
  774. // 前置詞、en + ジェロンディフ
  775. // 中性代名詞の処理はProcessObjectPronounで行う
  776. void
  777. Process_EN(TOKEN *start, TOKEN *prev, TOKEN *p)
  778. {
  779.     TOKEN    *next = p->next;
  780.  
  781.     if(next == NULL)    return;
  782.  
  783.     // en + 現在分詞 -> ジェロンディフ
  784.     if((next->frPart & FR_PART_VERB)
  785.     && (next->frTense & FR_TENSE_P_PRESENT)) {
  786.         ChangeToPreposition(p, "en");
  787.         p->frPart = FR_PART_PREPOSIT_EN_ENT;    // gerondif
  788.     }
  789.     if(IsObjectMatch(next, FR_PART_NOUN_ALL)
  790.     || IsObjectMatch(next, FR_PART_NUMETRIC_ALL)    // en 1998.
  791.     || next->frPart == FR_PART_SPECIAL_QUI
  792.     || next->frPart == FR_PART_SPECIAL_QUE
  793.     || next->frPart == FR_PART_SPECIAL_QUOI) {    // 前置詞
  794.         ChangeToPreposition(p, "en");
  795.     }
  796. }
  797.  
  798. //
  799. //
  800. //
  801. void
  802. Process_EST(TOKEN *p)
  803. {
  804.     ChangeToVerb(p, "]tre");
  805.     p->frAttrib = FR_ATTRIB_IL;
  806.     p->frTense = FR_TENSE_PRESENT;
  807. }
  808.  
  809. //
  810. // "FOIS"を見分ける
  811. // 回、倍+比較級
  812. //
  813. void
  814. Process_FOIS(TOKEN *start, TOKEN *prev, TOKEN *p)
  815. {
  816.     TOKEN    *next = p->next;
  817.  
  818.     if(next == NULL)    return;
  819.  
  820.     if(IsObjectMatch(prev, FR_PART_NUMETRIC_NUMBER)
  821.     && (next->frAttrib & (FR_ATTRIB)(FR_ATTRIB_PLUS    |FR_ATTRIB_MOINS))) {
  822.         ChangeToProadverb(p, "fois");
  823.         next->value  = prev->value;
  824.         DisconnectTOKEN(start, prev);
  825.         DisconnectTOKEN(start, p);
  826.     } else {
  827.         ChangeToNoun(p, "fois");
  828.     }
  829.     isChanged = TRUE;
  830. }
  831.  
  832. //
  833. // 'peu'の処理
  834. // un peu -> 少し
  835. // peu -> ほとんど~ない
  836. void
  837. Process_PEU(TOKEN *start, TOKEN *prev, TOKEN *p)
  838. {
  839.     if(prev->frPart == FR_PART_NUMETRIC_NUMBER
  840.     && prev->value == 1) {    // "un"か?        GetTokenFrenchは使えない
  841.         DisconnectTOKEN(start, prev);
  842.         ChangeToAdverb(p, "peu");    // ChangeToProadverb(p, dic_UnPeu);
  843.     } else {
  844.         if( p->next
  845.         && FlipAdjective(p->next)) {
  846.             DisconnectTOKEN(start, p);
  847.         } else {
  848.             ChangeToAdverb(p, "peu");    // ChangeToProadverb(p, dic_Peu);
  849.             p->jpProp |= JP_PROP_NEGATIVE;
  850.         }
  851.     }
  852. }
  853.  
  854. //
  855. // 'quand'を見分ける
  856. // 疑問代名詞、接続詞
  857. //  vous ]tes @ Paris depuis quand? のように位置では判別できない
  858. // ここでは、何も考えずに、2つの可能性を展開する
  859. void
  860. Process_QUAND(TOKEN *start, TOKEN *p)
  861. {
  862.     TOKEN    *altP = CopyCurrentTree(p, "Special Quand");
  863.  
  864.     ChangeToQuestion(p, "quand");
  865.     ChangeToPreposition(altP, "quand");
  866.     isChanged = TRUE;
  867. }
  868.  
  869. CMP_TOKEN    pat_QuiDesNum[] = {
  870.     // on ne sait pas @ qui des deux s'adresser.
  871.     CMP_TOKEN( FR_PART_SPECIAL_QUI,    JP_PROP_NONE,    NULL),
  872.     CMP_TOKEN( FR_PART_SPECIAL_DES,    JP_PROP_NONE,    NULL),
  873.     CMP_TOKEN( FR_PART_NUMETRIC_NUMBER,JP_PROP_NONE,    NULL),
  874.     CMP_TOKEN( FR_PART_NONE)
  875. };
  876.  
  877. //
  878. // 'qui'を見分ける
  879. // 疑問代名詞、関係代名詞
  880. void
  881. Process_QUI(TOKEN *start, TOKEN *prev, TOKEN *p)
  882. {
  883.     TOKEN    *next = p->next;
  884.  
  885.     if(p->frPartChoice & FR_PART_INTERROGATIVE) {
  886.         if(start == prev) {    // 先頭にあるということは、疑問代名詞?
  887.             isChanged = TRUE;
  888.             ChangeToQuestion(p, "qui");
  889.             return;
  890.         }
  891.         if(IsPatternMatch(pat_QuiDesNum, p)) {        // qui des deux -> 二人のうち誰か
  892.             TOKEN    *num = p->next->next;
  893.             DisconnectTOKEN(start, p->next);
  894.             DisconnectTOKEN(start, num);
  895.             AddChildTOKEN(p, num);
  896.             ChangeToQuestion(p, "qui");
  897.             num->frPart = FR_PART_NUMETRIC_CHOICE;
  898.             num->jpUnit = p->jpUnit;
  899.             return;
  900.         }
  901.         // 目的代名詞を飛ばす    eg) je ne sais @ qui des deux s'addresser.
  902.         TOKEN    *verb = SearchToken(FR_PART_VERB_UNCLEAR, next);
  903.         if( verb
  904.         && (verb->frTense & FR_TENSE_ORIGIN)) {
  905.         // je ne sais que faire. 原形独立文
  906.             TOKEN    *altP = CopyCurrentTree(p, "Qui 1");
  907.             ChangeToQuestion(altP, "qui");
  908.             p->frPartChoice = (FR_PART)(p->frPartChoice & ~FR_PART_INTERROGATIVE);
  909.         }
  910.     }
  911.  
  912.     if(next == NULL)    return;
  913.  
  914.     if((prev->frPart & FR_PART_NOUN)
  915.     && (next->frPart & FR_PART_VERB)
  916.     &&  next->which) {            // 関係代名詞
  917.         p->frPart = FR_PART_RELATIVE_SUBJECT;
  918.         DisconnectTOKEN(start, p);
  919.         DisconnectTOKEN(start, next);
  920.         SelectJpVerb2(prev, next);
  921.         p->object1 = next;
  922.         AddChildTOKEN(prev, p);
  923.     }
  924.     if( p->preposition            // la dame @ qui il parle.
  925.     && (prev->frPart & FR_PART_NOUN)
  926.     && (next->frPart & FR_PART_NOUN)
  927.     &&  next->next
  928.     && (next->next->frPart & FR_PART_VERB)) {
  929.         p->frPart = FR_PART_RELATIVE_OBJECT_N;
  930.         isChanged = TRUE;
  931.     }
  932. }
  933.  
  934. //
  935. // 'quoi'を見分ける
  936. // 疑問代名詞、関係代名詞
  937. void
  938. Process_QUOI(TOKEN *start, TOKEN *prev, TOKEN *p)
  939. {
  940.     TOKEN    *next = p->next;
  941.  
  942.     if(start == prev) {
  943.         // 先頭にあるということは、疑問代名詞?
  944.         ChangeToQuestion(p, "quoi");
  945.         return;
  946.     }
  947.  
  948.     if(next == NULL)    return;
  949.  
  950.     if( p->preposition
  951.     &&  p->preposition->frPart == FR_PART_PREPOSIT_DE    // de quoi manger. 何か食べるもの
  952.     &&  next
  953.     && IsObjectMatch(next, FR_PART_VERB_UNCLEAR)
  954.     && next->frTense == FR_TENSE_ORIGIN) {
  955.         TOKEN    *noun = PutNullNoun(), *subject = PutNullNoun();
  956.         noun->prtControl = PRT_CONTROL_ENABLE;
  957.         ChangeToPronoun(noun, "ce");
  958.         noun->jpProp = JP_PROP_THING;
  959.         ChangeToPronoun(subject, "on");
  960.         InsertTOKEN(prev, noun);
  961.         InsertTOKEN(p, subject);
  962.         p->frPart = FR_PART_RELATIVE_OBJECT_N;
  963.         return;
  964.     }
  965.  
  966.     if((prev->frPart & FR_PART_NOUN)
  967.     && (next->frPart & FR_PART_VERB)) {        // 関係代名詞
  968.         if(next->which == NULL) {
  969.             SelectJpVerb1(next);
  970.             if(next->which == NULL)    return;
  971.         }
  972.         p->frPart = FR_PART_RELATIVE_SUBJECT;
  973.         DisconnectTOKEN(start, p);
  974.         DisconnectTOKEN(start, next);
  975.         p->object2 = next;
  976.         AddChildTOKEN(prev, p);
  977.         return;
  978.     }
  979.     if( p->preposition            // ce @ quoi je pense.
  980.     && (next->frPart & FR_PART_NOUN)
  981.     &&  next->next
  982.     && IsObjectMatch(next->next, FR_PART_VERB_UNCLEAR)) {
  983.         if(!IsObjectMatch(prev, FR_PART_NOUN_DEMONSTRATIVE)) {
  984.             // C'est <ce> @ quoi je pense.
  985.             TOKEN    *noun = PutNullNoun();
  986.             noun->prtControl = PRT_CONTROL_ENABLE;
  987.             ChangeToPronoun(noun, "ce");
  988.             InsertTOKEN(prev, noun);
  989.         }
  990.         p->frPart = FR_PART_RELATIVE_OBJECT_N;
  991.         isChanged = TRUE;
  992.         return;
  993.     }
  994. }
  995.  
  996. //
  997. // 'que'を見分ける
  998. // 疑問代名詞、接続詞, 比較級(~よりも)
  999. //
  1000. void
  1001. Process_QUE(TOKEN *start, TOKEN *prev, TOKEN *p)
  1002. {
  1003.     TOKEN    *next = p->next;
  1004.  
  1005.     if(prev->frPart == FR_PART_INTERROGATIVE_UNCLEAR) {
  1006.         // Combien que de d{fauts il a! ->感嘆文
  1007.         return;
  1008.     }
  1009.  
  1010.     // Jacques est plus actif <que> Louise. ~よりも
  1011.     TOKEN    *lastCmp = NULL;    // 比較級を用いた個所
  1012.     for(TOKEN *q = start; q && q != p; q = q->next) {
  1013.         TOKEN *cmp = IsWordOwner(q, FR_ATTRIB_COMPARE);
  1014.         if(cmp)    lastCmp = cmp;    // 一番最後の比較級
  1015.     }
  1016.     if(lastCmp
  1017.     && (p->frPartChoice & FR_PART_CONJUNCTION)) {
  1018.         CopyCurrentTree(p, "Que 2", FR_PART_CONJUNCTION);
  1019.         p->frPart = FR_PART_CONJUNCTION_THAN;
  1020.         return;
  1021.     }
  1022.  
  1023.     if(p->frPartChoice & FR_PART_INTERROGATIVE) {
  1024.         // 先頭にあるということは、疑問代名詞?
  1025.         if((start == prev || prev->frPart == FR_PART_SPECIAL_COMMA)
  1026.         // 先頭にあっても eg) Qu'il parte imm{diatement!
  1027.         && (currentTree->punctuation & FR_PUNCT_QUESTION)) {
  1028.             ChangeToQuestion(p, "que");
  1029.             return;
  1030.         }
  1031.         // 目的代名詞を飛ばす    eg) je ne sais que <lui> r{pondre.    
  1032.         TOKEN    *verb = SearchToken(FR_PART_VERB_UNCLEAR, next);
  1033.         if( verb
  1034.         && (verb->frTense & FR_TENSE_ORIGIN)) {
  1035.         // je ne sais que faire. 原形独立文
  1036.             TOKEN    *altP = CopyCurrentTree(p, "Que 3");
  1037.             ChangeToQuestion(altP, "que");
  1038.             p->frPartChoice = (FR_PART)(p->frPartChoice & ~FR_PART_INTERROGATIVE);
  1039.         }
  1040.     }
  1041.  
  1042.     // ne ... que ~  ~しか
  1043. /*    if( prev
  1044.     && (prev->frPart & FR_PART_VERB)
  1045. */
  1046.     if( SearchToken(JP_PROP_NEGATIVE, start, p)
  1047.     &&  next
  1048.     && (next->frPart & (FR_PART)(FR_PART_NOUN | FR_PART_PREPOSIT))
  1049.     && (p->frPartChoice & FR_PART_ADVERB)) {
  1050.         CopyCurrentTree(p, "Que 4", FR_PART_ADVERB);
  1051.         next->jpEmphasis |= JP_EMPHASIS_ONLY;
  1052.         DisconnectTOKEN(start, p);
  1053.         return;
  1054.     }
  1055.  
  1056.     if(((prev->frPart & FR_PART_NOUN)
  1057.     || ((prev->frPart & FR_PART_PREPOSIT) && p->object1 == NULL))
  1058.     && (p->frPartChoice & FR_PART_RELATIVE)) {
  1059.         TOKEN *verb = p;
  1060.         while(verb) {
  1061.             verb = SearchToken(FR_PART_VERB_UNCLEAR, verb->next);
  1062.             if(verb == NULL)    break;
  1063.             // 他動詞見つけた
  1064.             if(!IsAlwaysIntransitiveVerb(verb)) {
  1065.                 TOKEN *altP = CopyCurrentTree(p, "Que 5");
  1066.                 altP->frPart = FR_PART_RELATIVE_OBJECT_N;
  1067.                 break;
  1068.             }
  1069.         }
  1070.         if(verb == NULL
  1071.         &&(prev->jpProp & JP_PROP_TIME)) {
  1072.             // Quatre jours que je marche. 動詞の目的語でなくても、関係代名詞になる
  1073.             TOKEN *altP = CopyCurrentTree(p, "Que 6");
  1074.             altP->frPart = FR_PART_RELATIVE_OBJECT;    // RELATIVE_OBJECT_N;
  1075.         }
  1076.     }
  1077.  
  1078.     if(next
  1079.     && next->frPart == FR_PART_SPECIAL_DE) {
  1080.         ChangeToQuestion(p, "que");
  1081.         return;
  1082.     }
  1083.     // 接続詞 <~ということ>
  1084.     if(IsObjectMatch(next, FR_PART_SENTENCE_NORMAL)
  1085.     && (p->frPartChoice & FR_PART_VERB)) {
  1086.         DisconnectTOKEN(start, p);
  1087.         next->frPart = FR_PART_SENTENCE_QUE;
  1088.         if(next->subject)
  1089.             next->subject->jpEmphasis |= JP_EMPHASIS_GA;
  1090.  
  1091.         if(p->preposition)
  1092.             InsertTOKEN(prev, p->preposition);
  1093.     }
  1094. }
  1095.  
  1096. //
  1097. // 'o|'を見分ける
  1098. // 疑問副詞、関係副詞
  1099. void
  1100. Process_OU(TOKEN *start, TOKEN *prev, TOKEN *p)
  1101. {
  1102.     TOKEN    *next = p->next;
  1103.  
  1104.     if(next == NULL)    return;
  1105.  
  1106.     if(start == prev) {
  1107.         // 先頭にあるということは、疑問代名詞?
  1108.         ChangeToQuestion(p, "o|");
  1109.         return;
  1110.     }
  1111.     if(prev->frPart & FR_PART_COMBINE) {
  1112.         // Mais, o| sont neiges?
  1113.         TOKEN *altP = CopyCurrentTree(p, "Ou 1");
  1114.         altP->frPart = FR_PART_RELATIVE_ADVERB;
  1115.         ChangeToQuestion(p, "o|");
  1116.         return;
  1117.     }
  1118.  
  1119.     if((prev->frPart & FR_PART_NOUN)
  1120.     && (prev->jpProp & (JP_PROP)(JP_PROP_TIME | JP_PROP_PLACE))
  1121.     && (next->frPart & FR_PART_NOUN)) {        // 関係副詞
  1122.         p->frPart = FR_PART_RELATIVE_ADVERB;
  1123.         isChanged = TRUE;
  1124.         return;
  1125.     }
  1126. }
  1127.  
  1128. //
  1129. // 'plus'を見分ける
  1130. // 形容詞、比較を作る副詞
  1131. // (比較級は、CombinePlusAdjectiveで処理されている)
  1132. //
  1133. void
  1134. Process_PLUS(TOKEN *start, TOKEN *prev, TOKEN *p)
  1135. {
  1136.     TOKEN    *next = p->next;
  1137.  
  1138.     if(prev
  1139.     && IsObjectMatch(prev, FR_PART_ARTICLE_PRONOUN)
  1140.     && (prev->frAttrib & FR_ATTRIB_SINGLE)) {    // le plus
  1141.         ChangeToProadverb(p, "plus");
  1142.         p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_PLUS);
  1143.         return;
  1144.     }
  1145.  
  1146.     if(next == NULL
  1147.     || IsObjectMatch(next, (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL)) == NULL) {
  1148.         TOKEN    *altP = CopyCurrentTree(p, "Plus 1");
  1149.         ChangeToProadverb(altP, "plus");
  1150.         altP->frAttrib = (FR_ATTRIB)(altP->frAttrib | FR_ATTRIB_PLUS);
  1151.     }
  1152.  
  1153.     // elle n'est plus jeune.
  1154.     ChangeToAdverb(p, "plus");
  1155. }
  1156.  
  1157. //
  1158. // <s'>を見分ける
  1159. // <se> or <si> エリジオン
  1160. void
  1161. Process_S(TOKEN *start, TOKEN *p)
  1162. {
  1163.     TOKEN    *altP = CopyCurrentTree(p, "S 1");
  1164.  
  1165.     ChangeToPronoun(p, "se");
  1166.     ChangeToPreposition(altP, "si");
  1167.  
  1168.     isChanged = TRUE;
  1169. }
  1170.  
  1171. //
  1172. // 'si'を見分ける
  1173. // 接続詞、疑問詞
  1174. void
  1175. Process_SI(TOKEN *start, TOKEN *p)
  1176. {
  1177.     if(start->next == p
  1178.     && (p->next == NULL || p->next->frPart == FR_PART_SPECIAL_COMMA)) {
  1179.         // Si, j'ai une voiture.
  1180.         ChangeToInterjection(p, "si");
  1181.     } else {
  1182.         ChangeToPreposition(p, "si");
  1183.     }
  1184.     isChanged = TRUE;
  1185. }
  1186.  
  1187. //
  1188. // 'seulement'を処理する
  1189. // 本当は、副詞だが、次のTokenのjmEmphasisに取り込む
  1190. //
  1191. void
  1192. Process_SEULEMENT(TOKEN *start, TOKEN *p)
  1193. {
  1194.     TOKEN    *next = p->next;
  1195.     if(next == NULL)    return;
  1196.  
  1197.     if(next->frPart & 
  1198.         (FR_PART)(FR_PART_NOUN | FR_PART_PREPOSIT | FR_PART_ADVERB | FR_PART_ADJECTIVE)) {
  1199.         DisconnectTOKEN(start, p);
  1200.         next->jpEmphasis |= JP_EMPHASIS_SEULEMENT;
  1201.     }
  1202. }
  1203.  
  1204. BOOL
  1205. IsAttribSingle(TOKEN *p) 
  1206. {
  1207.     if((p->frAttrib & FR_ATTRIB_SINGLE)
  1208.     &&  SearchToken(FR_PART_ARTICLE_DEFINIT, p->child))
  1209.         return(TRUE);
  1210.  
  1211.     return(FALSE);
  1212. }
  1213.  
  1214. static    JP_ADVERB    jpToutDeSuite[] = {
  1215.     JP_ADVERB("すぐ",    JP_KIND_KEIYODOSHI,    JP_PROP_TIME,    JP_PROP_ALL)
  1216. };
  1217. ADVERB adv_ToutDeSuite[] = { 
  1218.     "tout de suite",
  1219.     JPADVERB_DIC(jpToutDeSuite),
  1220.     NULL,
  1221.     NULL
  1222. };
  1223.  
  1224. CMP_TOKEN    pat_ToutDeSuite[] = {
  1225.     // tout de suite
  1226.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,    JP_PROP_NONE,    NULL),
  1227.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  1228.     CMP_TOKEN( FR_PART_NOUN_GENERAL,    "suite" ),
  1229.     CMP_TOKEN( FR_PART_NONE)
  1230. };
  1231.  
  1232. JP_PRONOUN    jpToutLeMonde[] = {
  1233.     JP_PRONOUN( FR_ATTRIB_ALL,    FR_ATTRIB_NONE,
  1234.                 JP_PROP_ALL,    JP_PROP_NONE,
  1235.                 NULL,
  1236.                 "全員",            JP_EMPHASIS_GA,    FR_PART_NOUN_POSSESIVE,
  1237.                 FR_ATTRIB_IL,    JP_PROP_HUMAN,    JP_UNIT_HITO
  1238.     )
  1239. };
  1240.     
  1241.  
  1242. PRONOUN    pronoun_ToutLeMonde[] = {
  1243.     { "tout le monde",        FR_ATTRIB_IL,    FR_SHORT_NONE, JPPRONOUN_DIC(jpToutLeMonde)    }
  1244. };
  1245.  
  1246. CMP_TOKEN    pat_ToutLeMonde[] = {
  1247.     // tout le monde.
  1248.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,    JP_PROP_NONE,    NULL),
  1249.     CMP_TOKEN( FR_PART_NOUN_GENERAL,    "monde" ),
  1250.     CMP_TOKEN( FR_PART_NONE)
  1251. };
  1252.  
  1253. BOOL
  1254. HasPluralArticleDay(TOKEN *p)
  1255. {
  1256.     TOKEN    *article = SearchToken(FR_PART_ARTICLE_DEFINIT, p->child);
  1257.  
  1258.     if(  article == NULL
  1259.     || !(article->frAttrib & FR_ATTRIB_PLURAL))
  1260.         return(FALSE);
  1261.     if(IsDayName(p))
  1262.         return(TRUE);
  1263.  
  1264.     return(FALSE);
  1265. }
  1266.  
  1267. BOOL
  1268. HasRelativeQue(TOKEN *p)
  1269. {
  1270.     if(SearchToken(FR_PART_RELATIVE_OBJECT, p->child))
  1271.         return(TRUE);
  1272.  
  1273.     return(FALSE);
  1274. }
  1275.  
  1276. static    JP_PROADJECTIVE    jpadj_TousLesDays[] = {
  1277.     JP_PROADJECTIVE(
  1278.         FR_PART_ADJECTIVE_DEMONSTRATIVE,
  1279.         "毎週",        JP_KIND_NONE,
  1280.         JP_PROP_CONDITION)
  1281. };
  1282. PROADJECTIVE    proadj_TousLesDays[] = {
  1283.     { "tous",    FR_ATTRIB_NONE,    FR_CHANGE_NONE, JPPROADJ_DIC(jpadj_TousLesDays)    },
  1284. };
  1285.  
  1286. CMP_TOKEN    pat_TousLesDays[] = {
  1287.     // tous les dimanches. -> 毎週月曜日
  1288.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,    JP_PROP_NONE,    NULL    ),
  1289.     CMP_TOKEN( FR_PART_NOUN_GENERAL,    JP_PROP_NONE,    HasPluralArticleDay),
  1290.     CMP_TOKEN( FR_PART_NONE)
  1291. };
  1292.  
  1293. CMP_TOKEN    pat_ToutNouns[] = {
  1294.     // tout jours. -> どの日も(毎日)
  1295.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,        JP_PROP_NONE,    NULL    ),
  1296.     CMP_TOKEN( FR_PART_NOUN_GENERAL,        JP_PROP_NONE,    HasNoArticlePossesive),
  1297.     CMP_TOKEN( FR_PART_NONE)
  1298. };
  1299.  
  1300. CMP_TOKEN    pat_ToutLeNoun[] = {
  1301.     // tout la journ{e. -> 一日の全て(一日中)
  1302.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,        JP_PROP_NONE,    NULL),
  1303.     CMP_TOKEN( FR_PART_NOUN_GENERAL,        JP_PROP_NONE,    IsAttribSingle),
  1304.     CMP_TOKEN( FR_PART_NONE)
  1305. };
  1306. CMP_TOKEN    pat_ToutLeNouns[] = {
  1307.     // tout les jours. -> 全ての一日(毎日)
  1308.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,        JP_PROP_NONE,    NULL    ),
  1309.     CMP_TOKEN( FR_PART_NOUN_GENERAL,        JP_PROP_NONE,    HasPluralArticlePossesive),
  1310.     CMP_TOKEN( FR_PART_NONE)
  1311. };
  1312.  
  1313. CMP_TOKEN    pat_ToutCeQue[] = {
  1314.     // tout ce que je as observ{. -> 君が観察したことの全て
  1315.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,    JP_PROP_NONE,    NULL    ),
  1316.     CMP_TOKEN( FR_PART_NOUN_IMPERSONAL,JP_PROP_NONE,    HasRelativeQue,    "ce"),
  1317.     CMP_TOKEN( FR_PART_NONE)
  1318. };
  1319.  
  1320. CMP_TOKEN    pat_TousLesNum[] = {
  1321.     // tous les deux. -> 二人・二つ共
  1322.     CMP_TOKEN( FR_PART_SPECIAL_TOUT,        JP_PROP_NONE,    NULL),
  1323.     CMP_TOKEN( FR_PART_ARTICLE_DEFINIT,    JP_PROP_NONE,    IsAttribPlural),
  1324.     CMP_TOKEN( FR_PART_NUMETRIC_NUMBER,    JP_PROP_NONE,    NULL),
  1325.     CMP_TOKEN( FR_PART_NONE)
  1326. };
  1327.  
  1328.  
  1329. //
  1330. // <TOUT>を見分ける
  1331. // 不定代名詞、形容詞、副詞
  1332. void
  1333. Process_TOUT(TOKEN *start, TOKEN *prev, TOKEN *p)
  1334. {
  1335.     if(IsPatternMatch(pat_ToutDeSuite, p)) {
  1336.         DisconnectTOKEN(start, p->next->next);
  1337.         DisconnectTOKEN(start, p->next);
  1338.         ChangeToAdverb(p, adv_ToutDeSuite);
  1339.     } else if(IsPatternMatch(pat_ToutLeMonde, p)) {
  1340. //        DisconnectTOKEN(start, p->next->next);
  1341.         DisconnectTOKEN(start, p->next);
  1342.         ChangeToPronoun(p, pronoun_ToutLeMonde);
  1343.     } else if(IsPatternMatch(pat_TousLesDays, p)) {
  1344.         TOKEN    *noun = p->next;
  1345.         TOKEN    *article = SearchToken(FR_PART_ARTICLE_DEFINIT, noun->child);
  1346.         if(article)    article->prtControl = PRT_CONTROL_DISABLE;    // 冠詞を消す
  1347.         ChangeToProadjective(p, proadj_TousLesDays);
  1348.         AttachAdjective(start, noun, p, FR_LOCATION_FRONT);
  1349.     } else if(IsPatternMatch(pat_ToutNouns, p)) {
  1350.         if(prev->frPart & FR_PART_VERB) {
  1351.             // Nous sommes tout Japonais. 私達は<みな>日本人です。
  1352.             ChangeToProadverb(p, *(char **)p->what);
  1353.         } else {
  1354.             TOKEN    *noun = p->next;
  1355.             ChangeToProadjective(p, *(char **)p->what);
  1356.             DisconnectTOKEN(start, p);
  1357.             AttachAdjective(start, noun, p, FR_LOCATION_FRONT);
  1358.             noun->jpEmphasis = JP_EMPHASIS_MO;
  1359.         }
  1360.     } else if(IsPatternMatch(pat_ToutNouns, p)) {
  1361.         TOKEN    *noun = p->next;
  1362.         DisconnectTOKEN(start, noun);
  1363.         AddChildTOKEN(p, noun);
  1364.         SelectJpNoun(NULL, noun, noun, JP_PROP_ALL);
  1365.         p->jpProp = noun->jpProp | JP_PROP_VOLUME;
  1366.     } else if(IsPatternMatch(pat_ToutCeQue , p)) {
  1367.     // tout ce que je as observ{. -> 君が観察したことの全て
  1368.         TOKEN    *noun = p->next;
  1369.         ChangeToPronoun(p, *(char **)p->what);
  1370.         DisconnectTOKEN(start, noun);
  1371.         AddChildTOKEN(p, noun);
  1372.         SelectJpNoun(NULL, p, p, JP_PROP_ALL);
  1373.         p->jpProp = noun->jpProp | JP_PROP_VOLUME;
  1374.     } else if(IsPatternMatch(pat_ToutLeNoun, p)) {
  1375.         TOKEN    *noun = p->next;
  1376.         ChangeToPronoun(p, *(char **)p->what);
  1377.         DisconnectTOKEN(start, noun);
  1378.         AddChildTOKEN(p, noun);
  1379.         SelectJpNoun(NULL, p, p, JP_PROP_ALL);
  1380.         p->jpProp = noun->jpProp | JP_PROP_VOLUME;
  1381.     } else if(IsPatternMatch(pat_ToutLeNouns, p)) {
  1382.         TOKEN    *noun = p->next;
  1383.         TOKEN    *article = SearchToken(FR_PART_ARTICLE_DEFINIT, noun->child);
  1384.         if(article == NULL)
  1385.             article = SearchToken(FR_PART_ADJECTIVE_POSSESIVE, noun->child);
  1386.         if(article)    article->prtControl = PRT_CONTROL_DISABLE;    // 冠詞を消す
  1387.         ChangeToAdjective(p, *(char **)p->what);
  1388.         AttachAdjective(start, noun, p, FR_LOCATION_FRONT);
  1389. //        DisconnectTOKEN(start, p);
  1390. //        AddChildTOKEN(noun, p);
  1391.     } else if(IsPatternMatch(pat_TousLesNum, p)) {
  1392.         TOKEN    *article = p->next;
  1393.         TOKEN    *num = article->next;
  1394.         DisconnectTOKEN(start, num);
  1395.         DisconnectTOKEN(start, article);
  1396.         p->value = num->value;
  1397.         ChangeToProadverb(p, *(char **)p->what);
  1398.     } else if(p->next
  1399.         && IsTokenFrench(p->next, "ce")) {
  1400.         // 変な候補を増やさない
  1401.         return;
  1402.  
  1403.     } else if(p->frPartChoice & FR_PART_NOUN) {
  1404.         TOKEN    *altP = CopyCurrentTree(p, "Tout 1", FR_PART_NOUN);
  1405.         ChangeToPronoun(p, *(char **)p->what);
  1406.     } else if(p->frPartChoice & FR_PART_ADVERB) {
  1407.         // Nous sommes tout Japonais.
  1408.         TOKEN    *altP = CopyCurrentTree(p, "Tout 3", FR_PART_ADVERB);
  1409.         ChangeToProadverb(p, *(char **)p->what);
  1410.     }
  1411. }
  1412.  
  1413. //
  1414. // FR_PART_SPECIALを 解析結果に変換する
  1415. //
  1416. void
  1417. ConvertSpecialWord(TOKEN *p, FR_PART frPart)
  1418. {
  1419.     switch(p->frPart) {
  1420.     case FR_PART_SPECIAL_DE:    // 不定冠詞、部分冠詞、前置詞(infを導く)、形容詞をともなう冠詞、否定冠詞
  1421.         if(frPart == FR_PART_PREPOSIT_DE) {
  1422.             TOKEN    *next = p->next;
  1423.             ChangeToPreposition(p, "de");
  1424.             p->which  = (void *)&dic_jpr_de[0];
  1425.             if(!IsObjectMatch(next, FR_PART_NOUN_ALL))
  1426.                 PrintInternalError( "Internal Error <ConvertSpecialWord> -2-\n");
  1427.             if(SelectJpPreposition1(p, next)) {
  1428.                 DisconnectTOKEN(p, next);
  1429.                 p->object1 = next;
  1430.             }
  1431.         } else if(frPart == FR_PART_PREPOSIT_DE_INF) {
  1432.             ChangeToPreposition(p, dic_DeInf);
  1433.         } else if(frPart & FR_PART_ADJECTIVE) {
  1434.             PrintInternalError( "Internal Error <ConverSpecialWord 2>\n");
  1435.         } else goto Error;
  1436.         break;
  1437.     case FR_PART_SPECIAL_EN:    // 前置詞、中性代名詞、en + ジェロンディフ
  1438.         if(frPart & FR_PART_NOUN) {
  1439.             ChangeToObjectPronoun(p, "en");
  1440.             p->frPart = frPart;    // (FR_PART)(FR_PART_NOUN_OBJECT_D | FR_PART_NOUN_OBJECT_I);
  1441.         } else if(frPart == FR_PART_PREPOSIT_DE) {
  1442.             ChangeToPreposition(p, "de");
  1443.         } else goto Error;
  1444.         break;
  1445.     case FR_PART_SPECIAL_LEUR:
  1446.         goto Error;
  1447.     default:
  1448.         return;
  1449.     }
  1450.     isChanged = TRUE;
  1451.     return;
  1452. Error:
  1453.     PrintInternalError( "Internal Error <ConvertSpecialWord>");
  1454. }
  1455.  
  1456. //
  1457. // 中性代名詞 y, enの<それ>
  1458. //
  1459. JP_PRONOUN    dic_IndicatingNoun[] = {
  1460.     JP_PRONOUN(    FR_ATTRIB_ALL,    FR_ATTRIB_NONE,
  1461.         JP_PROP_ALL,    JP_PROP_NONE,
  1462.         NULL,
  1463.         "それ",            JP_EMPHASIS_NONE,    FR_PART_NOUN_OBJECT_BOTH,
  1464.         FR_ATTRIB_ALL,    JP_PROP_ALL,        JP_UNIT_TSU)
  1465. };
  1466.  
  1467. PRONOUN    dic_indicationg_noun = 
  1468. {
  1469.     "中性代名詞よーん",
  1470.     FR_ATTRIB_ALL,    FR_SHORT_NONE,
  1471.     JPPRONOUN_DIC(dic_IndicatingNoun)
  1472. };
  1473. //
  1474. // 中性代名詞 y, enの<そこ>        j'vais
  1475. //
  1476. JP_PRONOUN    dic_IndicatingNounPlace[] = {
  1477.     JP_PRONOUN(    FR_ATTRIB_ALL,    FR_ATTRIB_NONE,
  1478.         JP_PROP_ALL,    JP_PROP_NONE,
  1479.         NULL,
  1480.         "そこ",            JP_EMPHASIS_NONE,    FR_PART_NOUN_OBJECT_I,
  1481.         FR_ATTRIB_ALL,    JP_PROP_ALL,        JP_UNIT_TSU
  1482.     )
  1483. };
  1484.  
  1485. PRONOUN    dic_indicationg_noun_place = 
  1486. {
  1487.     "中性代名詞よーん",
  1488.     FR_ATTRIB_ALL,    FR_SHORT_NONE,
  1489.     JPPRONOUN_DIC(dic_IndicatingNounPlace)
  1490. };
  1491.  
  1492. //
  1493. // en, y(中性代名詞)をdeや@で受けた場合
  1494. //
  1495. void
  1496. ChangeProperObject(TOKEN *p, FR_PART frPart, JP_PROP jpProp)
  1497. {
  1498.     if(p->frPart & FR_PART_SPECIAL) {
  1499.         ConvertSpecialWord(p, frPart);
  1500.     } else if(frPart == FR_PART_PREPOSIT_DE
  1501.         && IsTokenFrench(p, "en")) {
  1502.             ChangeToPreposition(p, "de");
  1503.             TOKEN *noun = PutNullNoun(FR_PART_NOUN_OBJECT_BOTH, PRT_CONTROL_ENABLE);
  1504.             ChangeToPronoun(noun, &dic_indicationg_noun);
  1505.             CombinePrepositionObject(p, p, noun);
  1506.     } else if(frPart == FR_PART_PREPOSIT_A
  1507.         && p->frPart == FR_PART_ADVERB_Y) {
  1508.             ChangeToPreposition(p, "@");
  1509.             TOKEN *noun = PutNullNoun(FR_PART_NOUN_OBJECT_BOTH, PRT_CONTROL_ENABLE);
  1510.             p->jpProp = jpProp;
  1511.             if((jpProp & JP_PROP_PLACE) && jpProp != JP_PROP_ALL)
  1512.                 ChangeToPronoun(noun, &dic_indicationg_noun_place);
  1513.             else
  1514.                 ChangeToPronoun(noun, &dic_indicationg_noun);
  1515.             CombinePrepositionObject(p, p, noun);
  1516.     }
  1517. }
  1518.  
  1519. //
  1520. // 一通り解析しても分からなかったもの
  1521. //
  1522. void
  1523. ProcessSpecialWord2(TOKEN *start)
  1524. {
  1525.     TOKEN    *prev = start;
  1526.     TOKEN    *p;
  1527.  
  1528.     for(p = start->next; p; p = p->next) {
  1529.         switch(p->frPart) {
  1530.         case FR_PART_SPECIAL_AUSSI:        Process2_AUSSI(start, prev, p);    break;
  1531.         case FR_PART_SPECIAL_COMMA:        Process2_COMMA(start, prev, p);                break;
  1532.         case FR_PART_SPECIAL_DE:        Process2_DE(start, prev, p);        break;
  1533. //        case FR_PART_SPECIAL_DES:        Process2_DES(start, prev, p);    break;
  1534.         case FR_PART_SPECIAL_ESTCEQUE:    Process2_EstCeQue(start, prev, p);    break;
  1535.         }
  1536.         prev = p;
  1537.     }
  1538. }
  1539.  
  1540.  
  1541. //
  1542. // aussiを見分ける
  1543. //
  1544. void
  1545. Process2_AUSSI(TOKEN *start, TOKEN *prev, TOKEN *p)
  1546. {
  1547.     TOKEN    *next = p->next;
  1548.     
  1549.     if(prev
  1550.     && prev->frPart & FR_PART_NOUN) {
  1551.         prev->jpEmphasis |= JP_EMPHASIS_MO;
  1552.         DisconnectTOKEN(start, p);
  1553.     }
  1554.     else if( next
  1555.     && (next->frPart & FR_PART_ADVERB_ADJECTIVE)) {
  1556.         next->frAttrib = (FR_ATTRIB)(next->frAttrib | FR_ATTRIB_AUSSI);
  1557.         DisconnectTOKEN(start, p);
  1558.     }
  1559. }
  1560.  
  1561. void
  1562. Process2_COMMA(TOKEN *start, TOKEN *prev, TOKEN *p)
  1563. {
  1564.     TOKEN    *next = p->next;
  1565.  
  1566.     if(next == NULL)    return;
  1567.  
  1568.     if((prev->frPart & FR_PART_COMBINE)
  1569.         && prev->object2 == NULL) {
  1570.         // Mais, o| est les neiges d'antan?
  1571.         DisconnectTOKEN(start, p);
  1572.         next->punctuation = FR_PUNCT_COMMA;
  1573.     } else if((next->frPart & FR_PART_COMBINE)
  1574.         && next->object1 == NULL) {
  1575.         if(next->object2 != NULL) {
  1576.             // , mais SV,    , car SV
  1577.             DisconnectTOKEN(start, p);
  1578.             next->punctuation = FR_PUNCT_COMMA;
  1579.         }
  1580.     }
  1581. }
  1582.  
  1583. CMP_TOKEN    pat_DeSentence1[] = {
  1584.     // d'une main tremblente, il a ouvert la bo^te.\j'
  1585.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  1586.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_NONE,    NULL),
  1587.     CMP_TOKEN( FR_PART_SPECIAL_COMMA,    JP_PROP_NONE,    NULL),
  1588.     CMP_TOKEN( FR_PART_SENTENCE_ALL,    JP_PROP_NONE,    IsLastToken),
  1589.     CMP_TOKEN( FR_PART_NONE)
  1590. };
  1591.  
  1592. CMP_TOKEN    pat_DeSentence2[] = {
  1593.     // d'une main tremblente il a ouvert la bo^te.'
  1594.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  1595.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_NONE,    NULL),
  1596.     CMP_TOKEN( FR_PART_SENTENCE_ALL,    JP_PROP_NONE,    IsLastToken),
  1597.     CMP_TOKEN( FR_PART_NONE)
  1598. };
  1599.  
  1600. CMP_TOKEN    pat_DeSentence3[] = {
  1601.     // On peut voir la montagne de la fenetre.
  1602.     CMP_TOKEN( FR_PART_SENTENCE_ALL,    JP_PROP_NONE,    NULL),
  1603.     CMP_TOKEN( FR_PART_SPECIAL_DE,        JP_PROP_NONE,    NULL),
  1604.     CMP_TOKEN( FR_PART_NOUN_ALL,        JP_PROP_NONE,    IsLastToken    ),
  1605.     CMP_TOKEN( FR_PART_NONE)
  1606. };
  1607.  
  1608. //
  1609. // 'de'を見分ける(その2)
  1610. // 冠詞 + 形容詞 + 複数名詞 ?,    部分冠詞? 否定冠詞?
  1611. void
  1612. Process2_DE(TOKEN *start, TOKEN *prev, TOKEN *p)
  1613. {
  1614.     if(start->next == p) {
  1615.         if(IsPatternMatch(pat_DeSentence1, p)
  1616.         || IsPatternMatch(pat_DeSentence2, p))
  1617.             ChangeToPreposition(p, "de");
  1618.     } else if(IsPatternMatch(pat_DeSentence3, prev)) {
  1619.         ChangeToPreposition(p, "de");
  1620.     }
  1621. }
  1622.  
  1623. //
  1624. // 'des'を見分ける(その2)
  1625. // 不定冠詞?
  1626. void
  1627. Process2_DES(TOKEN *start, TOKEN *prev, TOKEN *p)
  1628. {
  1629.     TOKEN    *next = p->next;
  1630.  
  1631.     if(next
  1632.     && IsObjectMatch(next, FR_PART_NOUN_GENERAL)
  1633.     && (next->frAttrib & FR_ATTRIB_PLURAL)
  1634.     // まだ、冠詞を持っていないこと
  1635.     && SearchToken(FR_PART_ARTICLE_ALL, next->child) == NULL) {
  1636.         // 'des' petits livres -> 'de' petits liveresのはず
  1637.         if(SearchToken(FR_PART_ADJECTIVE_GENERAL_F, next->child) == NULL
  1638.         && (p->frPartChoice & FR_PART_ARTICLE)) {
  1639.             // 不定冠詞
  1640.             if(!(next->jpProp & JP_PROP_PARTIAL))    // 問答無用
  1641.                 CopyCurrentTree(p, "Des 1", FR_PART_ARTICLE);
  1642.             ChangeToArticle(p, "des");
  1643.         } else if(p->frPartChoice & FR_PART_PREPOSIT) {
  1644.             if(prev
  1645.             // etreの後には、縮約冠詞がこないような気が...
  1646.             && !strcmp(GetTokenFrench(prev), "]tre")) {
  1647.                 currentTree->prtControl = PRT_CONTROL_DISABLE;
  1648.             } else {
  1649.                 // 縮約冠詞 ( des -> de + les )
  1650.                 PutToken(FR_PART_ARTICLE_DEFINIT,
  1651.                     (FR_ATTRIB)(FR_ATTRIB_BOTH_SEX | FR_ATTRIB_PLURAL | FR_ATTRIB_LEVEL3),
  1652.                     JP_PROP_NONE, NULL);
  1653.                 InsertTOKEN(p, lastToken);
  1654.                 ChangeToSpecial(p, "de");
  1655.                 ChangeToArticle(lastToken, "les");
  1656.             }
  1657.         }
  1658.     }
  1659. }
  1660.  
  1661. //
  1662. //
  1663. //
  1664. void
  1665. Process2_EstCeQue(TOKEN *start, TOKEN *prev, TOKEN *p)
  1666. {
  1667.     if(p->next == NULL
  1668.     || !(currentTree->punctuation & FR_PUNCT_QUESTION)) return;
  1669.  
  1670.     if((p->next->frPart & FR_PART_NOUN)
  1671.     &&  p->next->next
  1672.     && (p->next->next->frPart & FR_PART_VERB)) {
  1673.         p->next->next->jpProp |= JP_PROP_QUESTION;
  1674.         DisconnectTOKEN(start, p);
  1675.     } else if(IsObjectMatch(p->next, FR_PART_SENTENCE_ALL)
  1676.     && !(p->next->jpProp & JP_PROP_QUESTION)) {
  1677.         TOKEN    *sentence = p->next;
  1678.         if(sentence->object2)
  1679.             sentence->object2->jpProp |= JP_PROP_QUESTION;    // 動詞がある場合
  1680.         else
  1681.             p->next->jpProp |= JP_PROP_QUESTION;
  1682.         DisconnectTOKEN(start, p);
  1683.     }
  1684. }